Type Erasure কি এবং কিভাবে কাজ করে?

Java Technologies - জাভা জেনেরিক্স (Java Generics) - Type Erasure এবং Generics
290

Type Erasure হল একটি প্রক্রিয়া যা জাভা কম্পাইলার Generics-এর সাথে কাজ করার সময় ব্যবহার করে। Generics টাইপ প্যারামিটারগুলো compile-time এ চেক করা হয় এবং তারপর runtime এ Generics-এর তথ্য মুছে (erase) ফেলা হয়। এর ফলে জাভার JVM runtime এ Generics সম্পর্কে কোনো তথ্য সংরক্ষণ করে না।


কিভাবে Type Erasure কাজ করে?

Java-এর Generics backward compatibility নিশ্চিত করার জন্য Type Erasure ব্যবহার করে। Generics যোগ করার পরেও পুরনো কোড (pre-Java 5) এবং নতুন কোড একসাথে কাজ করতে পারে।

Type Erasure কাজ করে নিচের ধাপে:

  1. Compile-time এ টাইপ চেকিং নিশ্চিত করা:
    Generics টাইপ প্যারামিটার compile-time এ চেক করা হয়, যাতে টাইপ সেফটি বজায় থাকে।
  2. Runtime এ Generics মুছে ফেলা:
    Compile-time এ Generics-এর সমস্ত টাইপ প্যারামিটার তাদের উপযুক্ত বাউন্ড (যদি নির্দিষ্ট করা হয়) বা Object-এ প্রতিস্থাপন করা হয়।

Type Erasure উদাহরণ

Generics Class Example

public class GenericClass<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

// Usage:
GenericClass<String> obj = new GenericClass<>();
obj.setValue("Hello");
System.out.println(obj.getValue());

Type Erasure এর পরে:

public class GenericClass {
    private Object value;

    public void setValue(Object value) {
        this.value = value;
    }

    public Object getValue() {
        return value;
    }
}

Generics Method Example

public static <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

// Usage:
String[] stringArray = {"A", "B", "C"};
printArray(stringArray);

Type Erasure এর পরে:

public static void printArray(Object[] array) {
    for (Object element : array) {
        System.out.println(element);
    }
}

Bounded Type Parameters এবং Type Erasure

Generics-এ যদি বাউন্ড নির্ধারণ করা হয় (যেমন T extends Number), তবে টাইপ প্যারামিটারটি তার বাউন্ডের ক্লাস বা ইন্টারফেস-এ প্রতিস্থাপিত হয়।

উদাহরণ:

public class BoundedClass<T extends Number> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

Type Erasure এর পরে:

public class BoundedClass {
    private Number value;

    public void setValue(Number value) {
        this.value = value;
    }

    public Number getValue() {
        return value;
    }
}

Type Erasure এর সুবিধা

  1. Backward Compatibility:
    Type Erasure এর ফলে Generics-এর আগে তৈরি কোডের সাথে নতুন Generics কোড একসাথে কাজ করতে পারে।
  2. Runtime Efficiency:
    Runtime-এ টাইপ সংক্রান্ত অতিরিক্ত মেটাডেটা সংরক্ষণ না করার ফলে JVM-এ কার্যকারিতা বজায় থাকে।

Type Erasure এর সীমাবদ্ধতা

  1. Runtime এ Generics টাইপ ইনফরমেশন অনুপস্থিত:
    Compile-time টাইপ চেকিং সম্ভব হলেও runtime এ Generics টাইপ ইনফরমেশন মুছে যায়। ফলে নিচের সমস্যাগুলো দেখা দিতে পারে:

    List<String> stringList = new ArrayList<>();
    List<Integer> intList = new ArrayList<>();
    System.out.println(stringList.getClass() == intList.getClass()); // true
    

    উপরের উদাহরণে, Generics টাইপ ইনফরমেশন runtime-এ অনুপস্থিত হওয়ায় উভয় লিস্ট একই Class হিসেবে বিবেচিত হয়।

  2. Type Casting প্রয়োজন:
    Runtime এ টাইপ ইনফরমেশন মুছে ফেলার কারণে Object থেকে নির্দিষ্ট টাইপে কাস্টিং করতে হয়।
  3. Array of Generics:
    Generics এর কারণে array creation করতে সমস্যা হয়, কারণ runtime এ টাইপ ইনফরমেশন সংরক্ষিত থাকে না।

    List<String>[] array = new ArrayList<String>[10]; // Compile-time Error
    
  4. Overloaded Method Resolution:
    Generics ব্যবহার করলে Overloaded মেথডের সমস্যা হতে পারে:

    public void method(List<String> list) { }
    public void method(List<Integer> list) { }
    

    উপরের কোড runtime এ একই মেথডে রূপান্তরিত হয় এবং কম্পাইল-টাইম এ এরর দেয়।


Type Erasure এ Annotation ব্যবহার

Annotations যেমন @SuppressWarnings("unchecked") ব্যবহার করা হয় Generics সম্পর্কিত warnings থেকে মুক্তি পেতে।

@SuppressWarnings("unchecked")
public void method() {
    List<String> list = (List<String>) new ArrayList(); // Unchecked cast
}

  • Type Erasure Generics এর মাধ্যমে compile-time টাইপ সেফটি নিশ্চিত করে, তবে runtime এ Generics টাইপ ইনফরমেশন মুছে ফেলে।
  • এটি backward compatibility বজায় রাখার জন্য অপরিহার্য, তবে runtime টাইপ ইনফরমেশন না থাকার কারণে কিছু সীমাবদ্ধতা তৈরি হয়।
  • এর সুবিধা এবং সীমাবদ্ধতাগুলি বোঝার মাধ্যমে Generics আরও কার্যকরভাবে ব্যবহার করা যায়।
Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...